/**
 * 来源 http://blog.csdn.net/foruok/article/details/49120183
 * Readable
 * Readable流提供了一种将外部来源（比如文件、套接字等）的数据读入到应用程序的机制。
 * 可读的流有两种模式：流动模式和暂停模式。流动模式下，数据会自动从来源流出，跟不老泉似的，直到来源的数据耗尽。
 * 暂停模式下，你得通过stream.read()主动去要数据，你要了它才从来源读，你不要它就在那儿耗着等你。
 * 
 * ### 可读流在创建时都是暂停模式。暂停模式和流动模式可以互相转换
 * 要从暂停模式切换到流动模式，有下面三种办法：
 *
 * 给“data”事件关联了一个处理器
 * 显式调用resume()
 * 调用pipe()将可读流桥接到一个可写流上
 * 要从流动模式切换到暂停模式，有两种途径：
 *
 * 如果这个可读的流没有桥接可写流组成管道，直接调用pause()
 * 如果这个可读的流与若干可写流组成了管道，需要移除与“data”事件关联的所有处理器，并且调用unpipe()方法断开所有管道。
 * 需要注意的是，出于向后兼容的原因，移除“data”事件的处理器，可读流并不会自动从流动模式转换到暂停模式；
 * 还有，对于已组成管道的可读流，调用pause也不能保证这个流会转换到暂停模式
 * 
 * ### Readable流提供
 * 
 * readable：在数据块可以从流中读取的时候发出。它对应的处理器没有参数，可以在处理器里调用read([size])方法读取数据。
 * data：有数据可读时发出。它对应的处理器有一个参数，代表数据。如果你只想快快地读取一个流的数据，给data关联一个处理器是最方便的办法。
 * 处理器的参数是Buffer对象，如果你调用了Readable的setEncoding(encoding)方法，处理器的参数就是String对象。
 * end：当数据被读完时发出。对应的处理器没有参数。
 * close：当底层的资源，如文件，已关闭时发出。不是所有的Readable流都会发出这个事件。对应的处理器没有参数。
 * error：当在接收数据中出现错误时发出。对应的处理器参数是Error的实例，它的message属性描述了错误原因，stack属性保存了发生错误时的堆栈信息。
 * 
 * 它们读取或操作流
 * read([size])：如果你给read方法传递了一个大小作为参数，那它会返回指定数量的数据，如果数据不足，就会返回null。
 * 如果你不给read方法传参，它会返回内部缓冲区里的所有数据，如果没有数据，会返回null，此时有可能说明遇到了文件末尾。read返回的数据可能是Buffer对象，也可能是String对象。
 * setEncoding(encoding)：给流设置一个编码格式，用于解码读到的数据。调用此方法后，read([size])方法返回String对象。
 * pause()：暂停可读流，不再发出data事件
 * resume()：恢复可读流，继续发出data事件
 * 
 * pipe(destination,[options])：把这个可读流的输出传递给destination指定的Writable流，两个流组成一个管道。
 * options是一个JS对象，这个对象有一个布尔类型的end属性，默认值为true，当end为true时，Readable结束时自动结束Writable。
 * 注意，我们可以把一个Readable与若干Writable连在一起，组成多个管道，每一个Writable都能得到同样的数据。
 * 这个方法返回destination，如果destination本身又是Readable流，就可以级联调用pipe（比如我们在使用gzip压缩、解压缩时就会这样，马上会讲到）。
 * unpipe([destination])：端口与指定destination的管道。不传递destination时，断开与这个可读流连在一起的所有管道。
 */

var fs = require('fs');

var readable = fs.createReadStream('readable.js', {
    flags: 'r',
    encoding: 'utf8',
    autoClose: true,
    mode: 0666,
});

readable.on('open', function (fd) {
    console.log('file was opened, fd - ', fd);
});

readable.on('readable', function () {
    console.log('received readable');
});

readable.on('data', function (chunk) {
    console.log('read %d bytes: %s', chunk.length, chunk);
});

readable.on('end', function () {
    console.log('read end');
});

readable.on('close', function () {
    console.log('file was closed.');
});

readable.on('error', function (err) {
    console.log('error occured: %s', err.message);
});


